package com.yn.iotxiao.model.Hik;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@Data
public class HikUser {

    public HikUser(String employeeNo, String name) {
        this.employeeNo = employeeNo;
        this.name = name;
        this.valid = new HikUserValid();

        List<HkDoorNoPlan> plans = new ArrayList<>();
        plans.add(new HkDoorNoPlan());
        this.RightPlan = plans;
    }

    /*req, string, 工号(人员ID)*/
    private String employeeNo;
    /*opt, bool, 是否删除该人员*/
    private boolean deleteUser = false;
    /*opt, string, 姓名*/
    private String name;
    /*req, enum, 人员类型, subType:string, [normal#普通人(主人),visitor#来宾(访客),blackList#非授权名单人,maintenance#维护人员(包括保洁、维修人员
等),patient#病患,custom1#自定义人员类型1,custom2#自定义人员类型2,custom3#自定义人员类型3,custom4#自定义人员类型4,custom5#自定义人员类型5], dep:and, {$.UserInfo.deleteUser,eq,false},{$.UserInfo.deleteUser,eq,不存在}, desc:维护人员需要在任意时间都能进入房间*/
    private String userType = "normal";
    /*opt, bool, 是否关门延迟, desc:true-是，false-否*/
    private boolean closeDelayEnabled = false;
    private HikUserValid valid;
    /*"belongGroup": "1,3,5",*/
    private String belongGroup;
    /*opt, string, 密码*/
    private String password;
    /*opt, string, 单机密码, range:[4,8], desc:
    仅限在单机管理密码模式下(可通过/ISAPI/AccessControl/UserAndRight/PwMgrParams?format=json进行配置。)，
    人员使用该密码认证。*/
    private String localPassword;
    /*opt, string, 门权限, desc:代表对门1、门3有权限*/
    private String doorRight = "1";

    private List<HkDoorNoPlan> RightPlan;
    /*opt, int, 最大认证次数*/
    private int maxOpenDoorTime = 0;
    /*opt, int, 房间号*/
    private int roomNumber = 0;
    /*opt, int, 层号*/
    private int floorNumber = 0;
    /*opt, bool, 反锁开门权限, desc:true-有权限，false-无权限*/
    private boolean doubleLockRight = true;
    /*opt, bool, 是否具有设备本地UI访问权限, desc:true-有权限，false-无权限*/
    private boolean localUIRight = false;
    /*opt, enum, 人员验证方式, subType:string, [
    cardAndPw#刷卡+密码,
    card#刷卡,
    cardOrPw#刷卡或密码,
    fp#指纹,
    fpAndPw#指纹+密码,
    fpOrCard#指纹或刷卡,
    fpAndCard#指纹+刷卡,
    fpAndCardAndPw#指纹+刷卡+密码,
    faceOrFpOrCardOrPw#人脸或指纹或刷卡或密码,
    faceAndFp#人脸+指纹,
    faceAndPw#人脸+密码,
    faceAndCard#人脸+刷 卡,
    face#人脸,
    employeeNoAndPw#工号+密码,
    fpOrPw#指纹或密码,
    employeeNoAndFp#工号+指纹,
    employeeNoAndFpAndPw#工号+指纹+密码,
    faceAndFpAndCard#人脸+指纹+刷 卡,
    faceAndPwAndFp#人脸+密码+指纹,
    employeeNoAndFace#工号+人脸,
    faceOrfaceAndCard#人脸或人脸+刷卡,
    fpOrface#指纹或人脸,
    cardOrfaceOrPw#刷卡或人脸或密 码,
    cardOrFace#刷卡或人脸,
    cardOrFaceOrFp#刷卡或人脸或指纹,
    faceOrPw#人脸或密码,
    employeeNoAndFaceAndPw#工号+人脸+密码,
    cardOrFaceOrFaceAndCard#刷卡或人脸或人脸 +刷卡,
    iris#虹膜,
    faceOrFpOrCardOrPwOrIris#人脸或指纹或刷卡或密码或虹膜,
    faceOrCardOrPwOrIris#人脸或刷卡或密码或虹膜,
    cardOrFpOrFaceOrIris#刷卡或指纹或人脸或虹 膜,
    fpOrFaceOrIrisOrPw#指纹或人脸或虹膜或密码,
    cardOrFpOrIrisOrPw#刷卡或指纹或虹膜或密码,
    cardOrIrisOrPw#刷卡或虹膜或密码,
    cardAndIris#刷卡+虹膜,
    fpAndIris#指纹 +虹膜,
    faceAndIris#人脸+虹膜,
    irisAndPw#虹膜+密码,
    cardAndIrisAndPw#刷卡+虹膜+密码,
    faceAndIrisAndPw#人脸+虹膜+密码,
    cardAndFaceAndIris#刷卡+人脸+虹膜,Pw#密 码,cardOrFpOrPw#刷卡或指纹或密码,faceOrFpOrPw#人脸或指纹或密码,cardAndVp#刷卡+声音,faceAndVp#人脸+声音,fpAndVp#指纹+声音,pwAndVp#密码+声音,remoteControl#遥 控器,remoteControlAndFace#遥控器+人脸,remoteControlOrFace#遥控器或人脸,remoteControlOrCard#遥控器或卡,remoteControlOrFp#遥控器或指纹,remoteControlOrPw#遥控 器或密码,remoteControlOrCardOrFp#遥控器或卡或指纹,remoteControlOrCardOrFace#遥控器或卡或人脸,remoteControlOrCardOrPw#遥控器或卡或密 码,remoteControlOrFpOrFace#遥控器或指纹或人脸,remoteControlOrFpOrPw#遥控器或指纹或密码,remoteControlOrFaceOrPw#遥控器或人脸或密 码,remoteControlOrCardOrFpOrFace#遥控器或卡或指纹或人脸,remoteControlOrCardOrFpOrPw#遥控器或卡或指纹或密码,remoteControlOrFpOrFaceOrPw#遥控器或指纹或人脸或 密码,remoteControlOrCardOrFaceOrPw#遥控器或卡或人脸或密码,remoteControlOrCardOrFpOrFaceOrPw#遥控器或卡或指纹或人脸或密码], desc:人员验证方式的优先级高于读卡 器验证方式，若为空表示人员验证方式无效。*/
    private String userVerifyMode = "face";
    /*opt, bool, 设备是否进行人员重复添加校验, desc:false-不校验，true-校验(如果不配置该字段，则设备默认进行人员重复校验)(如果确认设备端不存在任何人 员信息，可将其置为false，则设备不进行重复校验，这样会加快下发速度;如果不确认，则不建议配置该字段)*/
    private boolean checkUser = true;
    /*opt, enum, 人脸图片对应的人员性别, subType:string, [male#男,female#女,unknown#未知]*/
    private String gender;
//        "PersonInfoExtends": [
//    /*opt, array, 人员信息扩展, subType:object, desc:用于配置人员在设备UI界面的扩展信息显示，明眸当前仅支持一个value，不支持id字段，用于作为工号显示;智
//    能主机按标准实现。*/ {
//        "id": 1,
//                /*opt, int, 人员信息扩展序号, range:[1,32], desc:与/ISAPI/AccessControl/personInfoExtendName?format=json中的id对应，用于关联value的name信 息;id不存在时，根据数组顺序默认从1开始*/
//                "value": "test"
//        /*opt, string, 人员信息扩展内容*/ }
////],
//        "dynamicCode": "123456",
//        /*opt, string, 动态权限码*/
//        "callNumbers": ["1-1-1-401"],
///*opt, array, 呼叫号码列表, subType:string, desc:roomNumber的扩展，支持多房间号，两者同时存在时，优先解析callNumbers。楼宇对讲:1、国内规则:1-1-1-
//层号+房间号。高三位表示层号，范围1~999;低两位表示房间号，范围1~99。eg:如层号为1，房间号为1，则为1-1-1-101;如层号为222，房间号为4，则为1-1-1-22204。2、海 外规则:1-1-1-房间号。房间号的范围1~9999。eg:如房间号为111，则为1-1-1-111。医疗对讲:1、国内规则:1-1-1-房间号-设备编号。总共5段，每1段最大为3位(即999)。 eg:如房间号为111，设备编号为222，则为1-1-1-111-222。*/
//        "floorNumbers": [1, 2],
//        /*opt, array, 层号列表, subType:int, desc:floorNumber的扩展，支持多层，两者同时存在时，优先解析floorNumbers。要求floorNumbers与callNumbers的数组元素 个数一一对应。楼宇对讲:1、国内eg:callNumbers为["1-1-1-101","1-1-1-302"]，则floorNumbers为[1,3];callNumbers为["1-1-1-101","1-1-1-102"]，则floorNumbers为 [1,1];2、海外eg:callNumbers为["1-1-1-1","1-1-1-99"]，由于callNumbers未包含层号，因此floorNumbers仅需要元素个数与callNumbers个数一一对应即可，若 floorNumbers为[A,B]，则表示A层的1号房间和B层的99号房间。医疗对讲:1、国内eg:callNumbers为["1-1-1-111-222","1-1-1-99-99"]，由于callNumbers未包含层号，因此 floorNumbers仅需要元素个数与callNumbers个数一一对应即可，若floorNumbers为[A,B]，则表示A层的111号房间和B层的99号房间。*/
//        "groupId": 1,
//        /*opt, int, 本地考勤组织编号*/
//        "localAtndPlanTemplateId": 1,
//        /*opt, int, 本地考勤计划模板*/
//        "groupName": "test",
//        /*opt, string, 组织架构, range:[1,64]*/
//        "ESDType": "handAndFoot",
//        /*opt, enum, ESD检测类型 , subType:string, [handAndFoot#手脚都检测,no#不检测,hand#检测手,foot#检测脚], desc:默认为no*/
//        "userLevel": "Employee",
//        /*opt, enum, 用户级别, subType:string, [Employee#普通员工,DepartmentManager#部门主管]*/
//        "userName": "test",
//        /*opt, string, 登录账号, range:[1,32], desc:数字、小写字母、大写字母、特殊字符(敏感信息加密)登录账号与登录密码字段必须同时下发*/
//        "loginPassword": "test",
//        /*opt, string, 登录密码, range:[8,16], desc:数字、小写字母、大写字母、特殊字符两种及以上组合(敏感信息加密)登录账号与登录密码字段必须同时下发*/ "userGroupNodeID": "test123",
//        /*opt, string, 人员组织编号, range:[0,32], desc:单个人员组织的唯一标识，由数字、大小写字母组成。*/
//        "regionPermissionGroupIDList": [1],
//        /*opt, array, 区域权限组编号列表, subType:int, desc:下发本字段，则不用下发RightPlan字段。本字段当前仅供设备配套Web使用。*/
//        "picID": "test",
    /*opt, string, 预置人员图片编号, range:[1,32], desc:设备本地认证结果显示支持通过选择预制卡通人像作为底图显示，一些机关单位或个人对隐私要求比较高，不 */
}
